package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 1、整合Mybatis-Plus
 *   1）、导入依赖
 *    <dependency>
 *             <groupId>com.baomidou</groupId>
 *             <artifactId>mybatis-plus-boot-starter</artifactId>
 *             <version>3.2.0</version>
 *   </dependency>
 *   2）、配置
 *      1、配置数据源
 *          1）、导入数据库驱动.
 *          2）、在application.yml中配置数据源相关信息
 *      2、配置Mybatis-Plus：
 *          1）、使用@MapperScan
 *          2)、在yml中指定映射文件位置
 *
 * 2、JSR303校验
 *  1）、在 pojo 上加相应校验注解 （ javax.validation.constraints该包下有大量检验注解 ）
 *  2)、 在相应处理器方法的入参前，加上：@Valid 或 @Validated
 *  3）、BindingResult 接受校验结果。
 *  4)、通过判断 BindingResult ，自行编写程序逻辑
 *  5)、分组校验（ save方法 、 update方法同一个对象，有不同校验规则 ）
 *      ①：在校验注解上，添加group属性。
 *      ②：在Controller方法上，添加@Validated注解，并指定value属性。
 *      ③：当Controller层使用@Validated注解时，若检验注解没有指定group属性，则检验不生效！！
 *  6)、自定义校验注解
 *      ①、编写一个自定义的检验注解
 *      ②、编写一个自定义的检验器
 *      ③、关联自定义的 检验注解 和 校验器
 *
 * 3、统一异常处理
 *  1）、ControllerAdvice + ExceptionHandle
 *
 *  4、thymeleaf模板引擎
 *   1）、引入依赖
 *      thymeleaf-starter
 *   2）、配置属性
 *      关闭缓存
 *   3）、静态资源放在static文件加下，对静态资源的访问(/.js/.css等)，
 *   SpringBoot会自动到静态资源路径下寻找。
 *   4）、thymeleaf模板页面，放大templates文件夹下。
 *
 *
 * 5、整合redis
 *   1）、引入依赖：data-redis-starter
 *   2）、yml中，简单配置redis的host等属性
 *   3）、使用SpringBoot自动注入的 RedisTemplate。
 *
 * 6、整合redisson,作为分布式锁等功能框架
 *   1）、引入依赖：redission
 *   2）、编写配置文件，注入RedissonClient实例
 *
 *  7、整合 SpringCache
 */
@EnableRedisHttpSession
@EnableCaching
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@EnableDiscoveryClient
@MapperScan("com.atguigu.gulimall.product.dao")
@SpringBootApplication
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
